/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package database;

import java.util.LinkedList;
import triviaException.TriviaException;

/**
 * Entorno de un nuevo juego y datos relacionados al mismo
 * @author Grupo 11 de Programacion Orientada a Objetos
 *
 */

public class GameUser {
    private Score usrscore;
    private LinkedList<Question> questions;
    private int currlevel;
    private double totalGameScore;

    /**
     * Crea una instancia de GameUser
     * @param usrname - Nombre del usuario que comenzará
     * una nueva partida
     * @throws TriviaException 
     */
    
    public GameUser(String usrname) throws TriviaException {
        super();
        usrscore = new Score(usrname, 0);
        questions = null;
        currlevel = -1;
        totalGameScore = 0;
        
    }

    /**
     * Obtiene un listado de las 10 preguntas configuradas
     * para la nueva partida
     * @return LinkedList<Question> - listado de 10 preguntas
     * @throws NullPointerException - Si no existe un listado
     */
    
    public LinkedList<Question> getQuestions() throws NullPointerException {
        if (questions == null) {
            throw (new NullPointerException("Game Questions not set"));

        }
        return questions;
    }

    /**
     * Almacena un listado de preguntas que se usaran para la 
     * nueva partida. Si el listado es invalido, no hace nada.
     * @param questions - listado de preguntas
     *
     */
    
    public void setQuestions(LinkedList<Question> questions) {
        
    	if (questions != null) {
	    	this.questions = questions;
	        
	        for (Question q : questions) {
	        	totalGameScore += q.getScore();
	        }
    	}

    }

    /**
     * Suma al puntaje hecho por el usuario de la partida
     * hasta el momento, una cantidad dada por score
     * @param score - puntaje a ser adicionado
     */
    
    public void addScore(int score) {
        usrscore.addToCurrentScore(score);
    }

    /**
     * Devuelve una instancia de Score, que contiene
     * el nombre del usuario que jugó la partida y su puntaje
     * total.
     * @return Score - Información del usuario y su puntaje total
     * @throws NullPointerException - Si no hay listado de preguntas,
     * es decir nunca se inicio una nueva partida.
     *
     */
    
    public Score getGameResults() throws NullPointerException {
        int score;

        if (questions == null) {
            throw (new NullPointerException("Game Questions not set"));

        }

        // Calcula el puntaje como puntaje del usuario / puntaje total de la partida
        
        score = (int)Math.round((usrscore.getScore() / totalGameScore) * 100.0d);

        // no hay problemas en el casteo pues siempre da entre 0 y 100
        usrscore.setScore(score);
        return usrscore;
    }

    /**
     * Obtiene el nivel de la partida actual.
     * @return in - nivel de la partida
     * @throws TriviaException - Si no se comenzó ninguna partida
     */
    
    public int getCurrlevel() throws TriviaException {

        if (currlevel == -1) {
            throw (new TriviaException("Game difficulty not set"));
        }
        return currlevel;
    }

    /**
     * Configura el nivel de la partida.
     * @throws TriviaException - nivel de partida inválido
     */
    
    public void setCurrlevel(int currlevel) throws TriviaException {

        if (currlevel < 0 || currlevel > 2) {
            throw (new TriviaException("Invalid difficulty level"));
        }

        this.currlevel = currlevel;
    }

}
